// #include <iostream>
// #include <cstdlib>
// #include <vector>
// #include <map>
// #include <string>
// #include <exception>
// 
// using namespace std;
// 
// const int WORD = 0;
// const int PROGRAM = 1;
// const int STATEMENT = 2;
// const int COMMAND = 3;
// const int IFSTAT = 4;
// 
// 
// typedef struct TTerm {
// 	int type;
// 	string value;
// 	vector<TTerm> parts;
// } TTerm;
// 
// 
// class MyException : public exception
// {
// public:
// 	string info;
// 	string line;
// 
// 	virtual const char* what() const throw() {
// 		return "My exception happened";
// 	}
// };
// 
// TTerm matchBNFWord(const string word, string& line){
// 	TTerm BNFWord;
// 	BNFWord.type = WORD;
// 
// 	for (int i=0; i<word.length(); ++i) {
// 		if (word[i] != line[i]) {
// 			cout << "need word " << word << endl;
// 			MyException e;
// 			e.info = "mismatch in BNFWord";
// 			e.line = line;
// 			throw e;
// 		}
// 	}
// 	line = line.substr(word.length(), line.length()-word.length());
// 	BNFWord.value = word;
// 
// 	return BNFWord;
// }
// 
// TTerm match_Command(string& line) {
// 	TTerm _command;
// 	_command.type = COMMAND;
// 
// 	TTerm t;
// 	bool hasErr = false;
// 
// 	try {
// 		t = matchBNFWord("TRADE", line);
// 	}
// 	catch (...) {
// 		hasErr = true;
// 	}
// 
// 	if (hasErr) {
// 		hasErr = false;
// 
// 		try {
// 			t = matchBNFWord("CHEAT", line);
// 		}
// 		catch (...) {
// 			hasErr = true;
// 		}
// 	}
// 
// 	if (hasErr) {
// 		MyException e;
// 		e.info = "mismatch in _Command";
// 		e.line = line;
// 		throw e;
// 	}
// 
// 
// 	return _command;
// }
// 
// TTerm match_Cond(string& line) {
// 
// }
// 
// TTerm match_Ifstat(string& line) {
// 	TTerm _ifstat;
// 	return _ifstat;
// }
// 
// 
// TTerm match_Statement(string& line) {
// 	TTerm _statement;
// 	_statement.type = STATEMENT;
// 
// 	TTerm t;
// 	bool hasErr = false;
// 
// 	try {
// 		t = match_Command(line);
// 	}
// 	catch (...) {
// 		hasErr = true;
// 	}
// 
// 	if (hasErr) {
// 		hasErr = false;
// 
// 		try {
// 			t = match_Ifstat(line);
// 		}
// 		catch (...) {
// 			hasErr = true;
// 		}
// 	}
// 
// 	if (hasErr) {
// 		MyException e;
// 		e.info = "mismatch in _Statement";
// 		e.line = line;
// 		throw e;
// 	}
// 
// 	return _statement;
// }
// 
// TTerm match_Program(string& line) {
// 	TTerm _program;
// 	_program.type = PROGRAM;
// 
// 	TTerm _statment = match_Statement(line);
// 	_program.parts.push_back(_statment);
// 
// 	TTerm BNFWord = matchBNFWord(".", line);
// 	_program.parts.push_back(BNFWord);
// 	return _program;
// }
// 
// int main(void)
// {
// 	string s = "hello";
// 	try {
// 		match_Statement(s);
// 	}
// 	catch (MyException e) {
// 		cout << e.info << endl;
// 		cout << e.line << endl;
// 	}
// 	return 0;
// }